package com.lanou3g.code0411;

import com.lanou3g.code0411.exception.IndexOutException;

/**
 * Created by dllo on 18/4/11.
 */

//用起来和数组差不多,一个啥都能放的容器,并且还不需要指定初始长度,能随着里面的内容多少,变大变小


    //使用的是Object类型,啥都能放,如果我们能够在创建 MyArray的时候,就能确定这个数组中,可以放的元素类型,那么在取出元素的时候,就不会
    //产生类型转换异常了

  //动态数组/数组扩容(是一个算法)

public class MyArray<E> {

   // private Object[] datas; // 用来放元素的数组
    private Object[] datas;
    private  int count;   //当前数组中已经存放的元素个数


    public MyArray() {
        //我们上来就定义一个能放10个元素的数组 (原始数组个数随意定)

       // datas = new Object[10];
        //datas = new E[10];
        datas = new Object[10];  //数组占内存空间是连续的,E类型不确定,无法画内存,所以不能使用E创建对象
        count = 0;

    }

    public void put(Object object){
        //放元素

       // datas[count] = object;
        datas[count] = object;
        count ++;

        //放满了,怎么办??????
        if (count == datas.length){
            //放满了
            //创建一个新数组,是原来数组长度的2倍
            Object[] newArr = new Object[datas.length * 2];
            //把旧数组中的所有元素放在新数组中
            for (int i = 0; i < datas.length; i++) {
                newArr[i] = (E)datas[i];
            }
            //把datas 赋值成新的,大的数组
            datas = newArr;
        }
    }

    public E get(int index){
        //根据下标取元素
        // 认为用户都很聪明,不会取超出范围的元素

        //TODO 使用异常机制来解决
        if (index < 0||index >= count){  //会超出范围

            //如果输入的索引超出了我们支持的范围,那么我们就让程序崩溃,并给出确切的错误信息
            throw new IndexOutException(count-1,index);


        }

        return (E) datas[index];  //强制转换 为对应的E

    }

   public void remove(int index){
        //根据下标 删除元素

    }

    //用来确定有多少元素
    public int size(){
        return count;
    }

}
